package simpledb.storage;

import simpledb.common.Type;
import simpledb.execution.Predicate;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.Serializable;

/**
 * 表示 SimpleDB 中元组 Tuple 字段值 Field 的接口
 * 所有字段类型 --- 如 IntField StringField 都必须实现 Field 接口
 */
public interface Field extends Serializable {

    /**
     * 返回字段值的字符串表达形式
     * 主要用于调试和日志的输出
     * @return  字段内容的字符串表示
     */
    String toString();

    /**
     * 判断两个 Field 对象是否相等
     * 必须重写该方法，确保不同对象但相同值的字段能正确识别为相等
     * @param field 要比较的对象
     * @return  是否相等
     */
    boolean equals(Object field);

    /**
     * 返回当前字段的哈希码
     * 不同的对象如果表示相同的值，应该返回相同的哈希码
     * 这对在集合如 HashMap 中使用 Field 对象很重要
     * @return  字段的哈希码
     */
    int hashCode();

    /**
     * 返回当前字段的数据类型
     * 可以是 Type.INT_TYPE 或 Type.STRING_TYPE
     * @return  当前字段的类型
     */
    Type getType();

    /**
     * 将当前字段的值与另一个字段进行比较
     * 使用给定的操作符（如等于、等于...）来进行比较
     * @param op        比较操作符，参考 Pridicate.Op 枚举
     * @param value     要比较的目标字段对象
     * @return          比较结果是否为 true
     */
    boolean compare(Predicate.Op op, Field value);

    /**
     * 将当前字段的字节表示写入指定的 DataOutputStream
     * 用于将字段持久化到磁盘或通过网络进行传输
     * @param dos           要写入的目标数据输入流
     * @throws IOException  如果写入过程发生 I/O 错误
     */
    void serialize(DataOutputStream dos) throws IOException;
}
